In [1]:
# Nesta seção as bibliotecas necessárias para o funcionamento do código são importadas

import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestRegressor
from IPython.display import display, Markdown, Latex
from sklearn.metrics import roc_auc_score
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, mean_absolute_error, mean_squared_error, r2_score

Resolução dos Exercícios¶

1. Considere o conjunto de dados disponível em aqui (dados crus aqui).¶

a. Observando o conjunto de dados (nome das colunas e tipos de dados), infira quais os possíveis objetivos de análise. Quais são as perguntas que poderiam ser respondidas com essa base de dados? Identifique as possíveis variáveis respostas e as variáveis explicativas.¶

In [2]:
cancer = pd.read_csv('./datasets/globalBreastCancerRisk.csv')
cancer.sample(10)
Out[2]:
country continent year lifeExp pop gdpPercap NewCasesOfBreastCancerIn2002 AlcoholComsumption BloodPressure BodyMassIndex Cholestorol Smoking
88 Paraguay Americas 2002 70.755 5884491 3783.674243 34.4 7.88 123.7607 25.36778 4.846562 14.8
86 Pakistan Asia 2002 63.610 153403524 2092.712441 50.1 0.06 126.2059 23.07639 4.591925 6.6
66 Libya Africa 2002 72.737 5368585 9534.677467 23.4 0.11 132.6075 28.51032 4.838883 NaN
49 Hungary Europe 2002 72.590 10083313 14843.935560 63.0 16.27 129.7824 25.59566 5.189877 33.9
37 Finland Europe 2002 78.370 5193039 28204.590570 84.7 12.52 128.6964 25.41902 5.436867 24.4
46 Guinea-Bissau Africa 2002 45.504 1332459 575.704718 28.1 3.68 129.6245 22.44935 4.170127 NaN
113 Tunisia Africa 2002 73.042 9770575 5722.895655 19.6 1.29 129.5677 27.26516 4.830195 1.9
98 Singapore Asia 2002 78.770 4197776 36023.105400 48.7 1.55 123.2673 23.23321 4.835357 NaN
5 Australia Oceania 2002 80.370 19546792 30687.754730 83.2 10.02 120.5113 26.25957 5.326858 21.8
61 Kenya Africa 2002 50.992 31386842 1287.514732 25.2 4.14 127.8673 22.62218 4.405716 2.2
In [3]:
cancer.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 123 entries, 0 to 122
Data columns (total 12 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   country                       123 non-null    object 
 1   continent                     123 non-null    object 
 2   year                          123 non-null    int64  
 3   lifeExp                       123 non-null    float64
 4   pop                           123 non-null    int64  
 5   gdpPercap                     123 non-null    float64
 6   NewCasesOfBreastCancerIn2002  123 non-null    float64
 7   AlcoholComsumption            123 non-null    float64
 8   BloodPressure                 123 non-null    float64
 9   BodyMassIndex                 123 non-null    float64
 10  Cholestorol                   123 non-null    float64
 11  Smoking                       93 non-null     float64
dtypes: float64(8), int64(2), object(2)
memory usage: 11.7+ KB
In [4]:
cancer.describe(include='number')
Out[4]:
year lifeExp pop gdpPercap NewCasesOfBreastCancerIn2002 AlcoholComsumption BloodPressure BodyMassIndex Cholestorol Smoking
count 123.0 123.000000 1.230000e+02 123.000000 123.000000 123.000000 123.000000 123.000000 123.000000 93.000000
mean 2002.0 65.533455 4.553622e+07 10117.222157 37.935772 6.041138 126.778938 24.692500 4.780173 13.806452
std 0.0 12.358554 1.508646e+08 11467.906309 24.712584 4.421065 3.808400 2.329809 0.411901 11.889005
min 2002.0 39.193000 2.880300e+05 446.403513 3.900000 0.020000 117.656800 19.724140 4.089284 0.300000
25% 2002.0 54.868000 4.447942e+06 1330.196332 19.500000 2.070000 123.862950 22.674800 4.393149 3.400000
50% 2002.0 70.755000 1.059581e+07 5351.568666 28.100000 5.550000 126.467200 25.121810 4.824590 9.100000
75% 2002.0 75.104500 3.122746e+07 12261.976500 50.600000 9.545000 129.744350 26.297125 5.102909 25.800000
max 2002.0 82.000000 1.280400e+09 44683.975250 101.100000 16.270000 134.237600 30.340410 5.658249 40.100000
In [5]:
cancer.describe(include='object')
Out[5]:
country continent
count 123 123
unique 123 5
top Afghanistan Africa
freq 1 46
In [6]:
for c in cancer.select_dtypes('number').columns:
    fig = px.box(cancer[c], height=600, width=800)
    fig.show()

Resposta a:¶

O dataset aparentemente apresenta dados relacionados a mortes por cancer de mama em países de diferentes continentes, trazendo dados demográficos e características/habitos da população.

Alguns exemplos de pergutas são:

  • Pessoas tem as mesmas chances de sobrevivência em todos os continentes?
  • Pessoas com hipertensão arterial tem menos chances de sobreviver?
  • Pessoas com sobrepeso tem menos chances de sobreviver?
  • Pessoas com colesterol alto tem menos chances de sobreviver?
  • Pessoas que fumam tem menos chances de sobreviver?
  • Pessoas que usam álcool tem menos chances de sobreviver?
  • Existe relação entre pib e mortalidade?
  • Existe relação entre pib e novos casos?

As variáveis lifeExp e NewCasesOfBreastCancerIn2002 poderiam ser utilizadas como variáveis respostas, e todas as outras como explicativas, exceto o ano, que permanece sem variação e o nome do país, que é um identificador que não se repete.

b. Faça uma análise descritiva de acordo com o que foi discutido no item anterior;¶

Resposta b:¶

Parte da análise já foi feita na resposta a. Vejamos agora a relação entre algumas das variáveis;

In [7]:
# Primeiro, vamos comparar a variável de expectativa de vida com as outras, removendo as que não interessam.
# Para compará-las, faremos um gráfico de dispersão.

outras = ['continent', 'pop', 'gdpPercap', 'AlcoholComsumption', 'BloodPressure', 'BodyMassIndex', 'Cholestorol', 'Smoking']

for v in outras:
    display(Markdown(f'## ANALISE DA VARIAVEL __{v.upper()}__'))
    fig = px.scatter(cancer, y='lifeExp', x=v, hover_data='country', height=600, width=1024, title=f'Dispersão de {v} por lifeExp')
    fig.show()
    fig = px.scatter(cancer, y='NewCasesOfBreastCancerIn2002', x=v, hover_data='country' ,height=600, width=1024, title=f'Dispersão de {v} por NewCasesOfBreastCancerIn2002')
    fig.show()

ANALISE DA VARIAVEL CONTINENT¶

ANALISE DA VARIAVEL POP¶

ANALISE DA VARIAVEL GDPPERCAP¶

ANALISE DA VARIAVEL ALCOHOLCOMSUMPTION¶

ANALISE DA VARIAVEL BLOODPRESSURE¶

ANALISE DA VARIAVEL BODYMASSINDEX¶

ANALISE DA VARIAVEL CHOLESTOROL¶

ANALISE DA VARIAVEL SMOKING¶

In [8]:
cancer.select_dtypes('number').corr()
Out[8]:
year lifeExp pop gdpPercap NewCasesOfBreastCancerIn2002 AlcoholComsumption BloodPressure BodyMassIndex Cholestorol Smoking
year NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
lifeExp NaN 1.000000 0.062449 0.681717 0.650152 0.313417 -0.519339 0.541387 0.830656 0.588062
pop NaN 0.062449 1.000000 -0.055308 -0.059314 -0.038531 -0.162692 -0.160413 -0.061245 -0.145194
gdpPercap NaN 0.681717 -0.055308 1.000000 0.796440 0.482582 -0.298199 0.395554 0.828968 0.638469
NewCasesOfBreastCancerIn2002 NaN 0.650152 -0.059314 0.796440 1.000000 0.593013 -0.325525 0.338701 0.758112 0.717657
AlcoholComsumption NaN 0.313417 -0.038531 0.482582 0.593013 1.000000 -0.017905 0.159407 0.476331 0.718278
BloodPressure NaN -0.519339 -0.162692 -0.298199 -0.325525 -0.017905 1.000000 -0.156743 -0.370713 -0.151423
BodyMassIndex NaN 0.541387 -0.160413 0.395554 0.338701 0.159407 -0.156743 1.000000 0.620644 0.256736
Cholestorol NaN 0.830656 -0.061245 0.828968 0.758112 0.476331 -0.370713 0.620644 1.000000 0.649361
Smoking NaN 0.588062 -0.145194 0.638469 0.717657 0.718278 -0.151423 0.256736 0.649361 1.000000
In [9]:
px.imshow(cancer.select_dtypes('number').corr(), height=1000, zmin=-1, zmax=1)

c. Ajuste modelos que sejam adequados ao problema. Discuta os pressupostos da modelagem.¶

In [10]:
# Para este exercício, levaremos em consideração a variável Expectativa de Vida, logo, por ser um valor numérico contínuo, trata-se de um problema de REGRESSÃO.
# Nas análises gráficas, variáveis como GDP, colesterol e fumo têm correlação com a variável de expectativa de vida.
# Testaremos uma regressão linear:

lrm = LinearRegression()

interesse = outras + ['lifeExp']
cancer_ordenado = pd.get_dummies(cancer[interesse]).sort_values(by='lifeExp').dropna()
Xm = cancer_ordenado.drop('lifeExp', axis=1).values
ym = cancer_ordenado['lifeExp'].values

lrm.fit(Xm, ym)

print(f'Parametros da regressão: intercept: {lrm.intercept_}, coef: {lrm.coef_}, formula: (intercept + coef * variável = resultado)') 

fig = px.line(height=600)

fig.add_trace(go.Scatter(y=ym, mode='lines+markers', name='Valores Reais'))
fig.add_trace(go.Scatter(y=lrm.predict(Xm), mode='lines+markers', name='Regressão'))

fig.show()
Parametros da regressão: intercept: 2.2937667886588713, coef: [ 5.45717746e-09  4.52630506e-05 -5.60799494e-01 -5.01444111e-02
 -1.96286947e-01  1.67042997e+01  5.70027167e-03 -8.14799678e+00
  4.09052428e+00 -2.86889131e+00  3.56383455e+00  3.36252925e+00], formula: (intercept + coef * variável = resultado)

d. Verifique se o modelo proposto é adequado fazendo uma análise de resíduos.¶

In [11]:
for m in [mean_absolute_error, mean_squared_error, r2_score]:
    resultado = m(ym, lrm.predict(Xm))
    print(f'Métrica: {m}, Resultado: {resultado}')
Métrica: <function mean_absolute_error at 0x7fe0c83bbd00>, Resultado: 3.5980626731848973
Métrica: <function mean_squared_error at 0x7fe0c83e80d0>, Resultado: 24.750398273113124
Métrica: <function r2_score at 0x7fe0c83e85e0>, Resultado: 0.8014124519718855

e. Discuta como que os dados faltantes, NA (Not Avaliable) na coluna “Smoking”, podem¶

impactar na sua análise.

In [12]:
# Na minha análise, precisei me preocupar com os dados faltantes na hora de criar o modelo, já que a regressão linear não sabe lidar com valores ausentes.

2. Considere os dados disponíveis aqui sobre o salário anual (em mil USD) de uma amostra aleatória de 220 executivos (145 homens e 75 mulheres) (Foster, Stine e Waterman, 1998, pgs. 180-188).¶

O salário é relacionado com as seguintes variáveis explicativas: sexo (1: masculino; 0: feminino), posição na empresa (varia de 1 a 9, quanto maior o valor mais alta a posição) e anos de experiência no cargo.

  • a. Faça uma análise descritiva.
  • b. Faça uma modelagem que relaciona a variável resposta com as variáveis explicativas.
  • c. Qual das duas variáveis dependentes que mais impactam no valor do salário?
  • d. Discuta como que a relação entre as variáveis explicativas pode impactar na variável resposta.
  • e. É possível afirmar que há uma desigualdade salarial entre sexos? E podemos concluir que uma pessoa ganha menos devido ao seu sexo?

a. Faça uma análise descritiva.¶

In [13]:
salarios = pd.read_csv('./datasets/salarios_fixed.txt', sep=';')
salarios.head(20)
Out[13]:
salario genero posicao experiencia
0 148 Masculino 7 16.7
1 165 Masculino 7 6.7
2 145 Masculino 5 14.8
3 139 Feminino 7 13.9
4 142 Feminino 6 6.4
5 144 Masculino 5 9.1
6 128 Feminino 3 8.5
7 143 Masculino 6 18.2
8 157 Masculino 7 13.0
9 150 Masculino 7 21.6
10 115 Masculino 2 5.9
11 133 Feminino 3 9.1
12 128 Masculino 4 4.7
13 154 Masculino 6 11.5
14 121 Feminino 3 8.5
15 150 Masculino 8 22.4
16 133 Masculino 3 7.0
17 149 Masculino 5 12.2
18 145 Masculino 4 11.8
19 145 Masculino 7 12.0
In [14]:
# Informações básicas sobre os dados:

salarios.describe()
Out[14]:
salario posicao experiencia
count 220.000000 220.000000 220.000000
mean 142.868182 5.068182 10.478636
std 12.520518 1.787804 5.215060
min 110.000000 1.000000 1.700000
25% 133.000000 4.000000 6.600000
50% 143.500000 5.000000 9.500000
75% 151.000000 6.000000 13.400000
max 172.000000 9.000000 26.100000
In [15]:
salarios.describe(include='object')
Out[15]:
genero
count 220
unique 2
top Masculino
freq 145
In [16]:
salarios.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 220 entries, 0 to 219
Data columns (total 4 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   salario      220 non-null    int64  
 1   genero       220 non-null    object 
 2   posicao      220 non-null    int64  
 3   experiencia  220 non-null    float64
dtypes: float64(1), int64(2), object(1)
memory usage: 7.0+ KB
In [17]:
for c in salarios.select_dtypes('number').columns:
    fig = px.box(salarios[c], height=600, width=800)
    fig.show()
In [18]:
# Como o dataset está balanceado entre homens e mulheres?

salarios.value_counts('genero').plot(kind='bar', backend='plotly')
In [19]:
# Como o salário se comporta de acordo com o gênero?

fig = px.bar(salarios.sort_values(ascending=False, by='salario'), x='genero', y='salario', color='genero', height=600)
fig.show()
In [20]:
# O gráfico anterior mostra a soma dos salários dos homens e mulheres. Tem mais homens que mulheres no dataset. Teremos que analisar de outras formas.
# Como o salário se comporta de acordo com a posição?

fig = px.scatter(salarios.sort_values(ascending=False, by='salario'), x='posicao', y='salario', color='genero', height=600)
fig.show()
In [21]:
# Como o salário se comporta de acordo com a experiência?

fig = px.scatter(salarios.sort_values(ascending=False, by='salario'), x='experiencia', y='salario', color='genero', height=600)
fig.show()
In [ ]:
 
In [22]:
# Qual o salário médio dos homens e das mulheres?

fig = px.line(height=600)

fig.add_trace(go.Scatter(y=salarios.query('genero == "Masculino"').salario, mode='lines+markers', name='Homens'))
fig.add_trace(go.Scatter(y=salarios.query('genero == "Feminino"').salario, mode='lines+markers', name='Mulheres'))

fig.show()
In [23]:
# Quais variáveis tem correlação com salário?

salarios_num = pd.get_dummies(salarios)
salarios_num.corr()
Out[23]:
salario posicao experiencia genero_Feminino genero_Masculino
salario 1.000000 0.819024 0.311747 -0.138261 0.138261
posicao 0.819024 1.000000 0.569690 -0.323168 0.323168
experiencia 0.311747 0.569690 1.000000 -0.446360 0.446360
genero_Feminino -0.138261 -0.323168 -0.446360 1.000000 -1.000000
genero_Masculino 0.138261 0.323168 0.446360 -1.000000 1.000000

A tabela de correlações mostra que quem atinge os maiores salários é quem tem as posições mais altas.¶

Um fator com alta correlação com a posição é a experiência.¶

Por sua vez, o Gênero Masculino está mais correlacionado à experiência que o Feminino.¶

b. Faça uma modelagem que relaciona a variável resposta com as variáveis explicativas.¶

In [24]:
lrm = LinearRegression()

salarios_num_ordenado = pd.get_dummies(salarios.sort_values(by='salario'))
Xm = salarios_num_ordenado.drop('salario', axis=1).values
ym = salarios_num_ordenado['salario'].values

lrm.fit(Xm, ym)

print(f'Parametros da regressão: intercept: {lrm.intercept_}, coef: {lrm.coef_}, formula: (intercept + coef * variável = resultado)') 

fig = px.line(height=600)

fig.add_trace(go.Scatter(y=ym, mode='lines+markers', name='Valores Reais'))
fig.add_trace(go.Scatter(y=lrm.predict(Xm), mode='lines+markers', name='Regressão'))

fig.show()
Parametros da regressão: intercept: 114.16148210557286, coef: [ 6.71013498 -0.47251114  1.1006661  -1.1006661 ], formula: (intercept + coef * variável = resultado)

c. Qual das duas variáveis dependentes que mais impactam no valor do salário?¶

Posição e Genero.

d. Discuta como que a relação entre as variáveis explicativas pode impactar na variável resposta.¶

A tabela de correlações mostra que quem atinge os maiores salários é quem tem as posições mais altas. Um fator com alta correlação com a posição é a experiência. Por sua vez, o Gênero Masculino está mais correlacionado à experiência que o Feminino.

e. É possível afirmar que há uma desigualdade salarial entre sexos? E podemos concluir que uma pessoa ganha menos devido ao seu sexo?¶

Em minha análise não consegui dizer isso, dado que os dados estão bastante desbalanceados, e que o fator mais importante foi a posição ocupada.

3. Em um estudo para investigar a incidência de dengue numa determinada cidade da costa mexicana, um total de 196 indivíduos, escolhidos aleatoriamente em dois setores da cidade, respondeu às seguintes perguntas:¶

  • I. idade: idade do entrevistado (em anos);
  • II. nível: nível socioeconômico (nível=1, nível alto; nível=2, nível médio; nível=3, nível baixo);
  • III. setor: setor da cidade onde mora o entrevistado (setor=1, setor 1; setor=2, setor 2)
  • IV. caso: se o entrevistado contraiu (caso=1) ou não (caso=0) a doença recentemente.

Um dos objetivos do estudo é tentar prever ou explicar a probabilidade de um indivíduo contrair a doença dadas as variáveis explicativas. Os dados estão disponíveis aqui.

  • a. Faça uma análise descritiva
  • b. Faça uma modelagem adequada.
  • c. De acordo com o seu modelo, qual é a probabilidade de uma pessoa de nível socioeconômico baixo, que possui 40 anos e que mora no setor 2 contrair dengue?
  • d. De acordo com o seu modelo uma pessoa idosa de 70 anos possui maior chance de contrair dengue do que uma pessoa jovem de 20 anos? Quais seriam essas chances?
  • e. Sua modelagem permite concluir que o fator socioeconômico influência na probabilidade da pessoa contrair dengue?

a. Faça uma análise descritiva¶

In [37]:
dengue = pd.read_csv('datasets/dengue_fixed.txt', names=['Idade', 'Nivel', 'Setor', 'Dengue'], sep=';')
dengue.head(20)
Out[37]:
Idade Nivel Setor Dengue
0 33 1 1 0
1 35 1 1 0
2 6 1 1 0
3 60 1 1 0
4 18 3 1 1
5 26 3 1 0
6 6 3 1 0
7 31 2 1 1
8 26 2 1 1
9 37 2 1 0
10 23 1 1 0
11 23 1 1 0
12 27 1 1 0
13 9 1 1 1
14 37 1 2 1
15 22 1 2 1
16 67 1 2 1
17 8 1 2 0
18 6 1 2 1
19 15 1 2 1
In [38]:
dengue.describe()
Out[38]:
Idade Nivel Setor Dengue
count 196.000000 196.000000 196.000000 196.000000
mean 25.178571 1.964286 1.403061 0.290816
std 18.904721 0.867505 0.491769 0.455302
min 1.000000 1.000000 1.000000 0.000000
25% 10.750000 1.000000 1.000000 0.000000
50% 21.000000 2.000000 1.000000 0.000000
75% 35.000000 3.000000 2.000000 1.000000
max 85.000000 3.000000 2.000000 1.000000
In [39]:
dengue.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 196 entries, 0 to 195
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   Idade   196 non-null    int64
 1   Nivel   196 non-null    int64
 2   Setor   196 non-null    int64
 3   Dengue  196 non-null    int64
dtypes: int64(4)
memory usage: 6.2 KB
In [40]:
px.box(dengue['Idade'], height=600)
In [42]:
# Neste momento, vejamos as correlações antes de alterarmos os tipos dos dados para categorias mais fáceis de ler:
dengue.corr()
Out[42]:
Idade Nivel Setor Dengue
Idade 1.000000 -0.092167 0.109160 0.251914
Nivel -0.092167 1.000000 -0.230541 -0.038487
Setor 0.109160 -0.230541 1.000000 0.275428
Dengue 0.251914 -0.038487 0.275428 1.000000
In [43]:
dengue['Nivel'] = dengue['Nivel'].replace({1: 'alto', 2: 'medio', 3: 'baixo'})
dengue['Setor'] = dengue['Setor'].replace({1: 'setor_1', 2: 'setor_2'})
dengue['Dengue'] = dengue['Dengue'].replace({1: True, 0: False})
dengue.head(20)
Out[43]:
Idade Nivel Setor Dengue
0 33 alto setor_1 False
1 35 alto setor_1 False
2 6 alto setor_1 False
3 60 alto setor_1 False
4 18 baixo setor_1 True
5 26 baixo setor_1 False
6 6 baixo setor_1 False
7 31 medio setor_1 True
8 26 medio setor_1 True
9 37 medio setor_1 False
10 23 alto setor_1 False
11 23 alto setor_1 False
12 27 alto setor_1 False
13 9 alto setor_1 True
14 37 alto setor_2 True
15 22 alto setor_2 True
16 67 alto setor_2 True
17 8 alto setor_2 False
18 6 alto setor_2 True
19 15 alto setor_2 True

b. Faça uma modelagem adequada.¶

In [44]:
# O problema é de classificação, com variáveis categóricas em sua maioria, tanto alvo quanto preditoras.
dengue_num = pd.get_dummies(dengue)
dengue_num.corr()
Out[44]:
Idade Dengue Nivel_alto Nivel_baixo Nivel_medio Setor_setor_1 Setor_setor_2
Idade 1.000000 0.251914 0.110942 -0.053363 -0.066079 -0.109160 0.109160
Dengue 0.251914 1.000000 0.036970 -0.031820 -0.006486 -0.275428 0.275428
Nivel_alto 0.110942 0.036970 1.000000 -0.599564 -0.464420 -0.169620 0.169620
Nivel_baixo -0.053363 -0.031820 -0.599564 1.000000 -0.430331 0.243437 -0.243437
Nivel_medio -0.066079 -0.006486 -0.464420 -0.430331 1.000000 -0.078069 0.078069
Setor_setor_1 -0.109160 -0.275428 -0.169620 0.243437 -0.078069 1.000000 -1.000000
Setor_setor_2 0.109160 0.275428 0.169620 -0.243437 0.078069 -1.000000 1.000000
In [46]:
lgrm = LogisticRegression()

dengue_ordenado = dengue_num.sort_values(by='Dengue')
Xm = dengue_ordenado.drop('Dengue', axis=1).values
ym = dengue_ordenado['Dengue'].values

lgrm.fit(Xm, ym)

print(f'Parametros da regressão: intercept: {lrm.intercept_}, coef: {lrm.coef_}, formula: (intercept + coef * variável = resultado)') 

fig = px.line(height=600)

fig.add_trace(go.Scatter(y=ym, mode='lines+markers', name='Valores Reais'))
fig.add_trace(go.Scatter(y=lgrm.predict(Xm), mode='lines+markers', name='Regressão'))

fig.show()
Parametros da regressão: intercept: 114.16148210557286, coef: [ 6.71013498 -0.47251114  1.1006661  -1.1006661 ], formula: (intercept + coef * variável = resultado)
In [47]:
y_score = lgrm.predict_proba(Xm)[:, 1]
roc_auc_score(ym, y_score)
Out[47]:
0.7273759939416887
In [48]:
cm = confusion_matrix(ym, lgrm.predict(Xm), labels=lgrm.classes_)

fig, ax = plt.subplots(figsize=(12,12))
ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=lgrm.classes_).plot(ax=ax)
plt.show()
No description has been provided for this image

c. De acordo com o seu modelo, qual é a probabilidade de uma pessoa de nível socioeconômico baixo, que possui 40 anos e que mora no setor 2 contrair dengue?¶

In [56]:
lgrm.predict([[40, 0, 1, 0, 0, 1]]), lgrm.predict_proba([[40, 0, 1, 0, 0, 1]])
Out[56]:
(array([ True]), array([[0.44534214, 0.55465786]]))
In [58]:
# é positiva, de 55%

d. De acordo com o seu modelo uma pessoa idosa de 70 anos possui maior chance de contrair dengue do que uma pessoa jovem de 20 anos? Quais seriam essas chances?¶

In [60]:
# Considerando o mesmo cenário anterior e variando apenas as idades:

lgrm.predict([[70, 0, 1, 0, 0, 1]]), lgrm.predict_proba([[70, 0, 1, 0, 0, 1]])
Out[60]:
(array([ True]), array([[0.26348661, 0.73651339]]))
In [59]:
lgrm.predict([[20, 0, 1, 0, 0, 1]]), lgrm.predict_proba([[20, 0, 1, 0, 0, 1]])
Out[59]:
(array([False]), array([[0.57918668, 0.42081332]]))
In [61]:
# A pessoa de 70 anos teria 73% de chances de ter dengue, enquanto a pessoa de 20 anos teria 42% de chances.

e. Sua modelagem permite concluir que o fator socioeconômico influência na probabilidade da pessoa contrair dengue?¶

Muito pouco, quando comparado ao setor e idade.